package net.hserver.oauth.controller;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.oauth2.SaOAuth2Manager;
import cn.dev33.satoken.oauth2.consts.SaOAuth2Consts;
import cn.dev33.satoken.oauth2.processor.SaOAuth2ServerProcessor;
import cn.dev33.satoken.oauth2.template.SaOAuth2Util;
import cn.hserver.plugin.web.annotation.Controller;
import cn.hserver.plugin.web.annotation.RequestMapping;

import java.util.LinkedHashMap;
import java.util.Map;

@Controller
public class OAuthController {

    // 模式一：Code授权码 || 模式二：隐藏式
    @RequestMapping("/oauth2/authorize")
    public Object authorize() {
        String authorize = SaOAuth2Consts.Api.authorize;
        return SaOAuth2ServerProcessor.instance.authorize();
    }

    // 用户登录
    @RequestMapping("/oauth2/doLogin")
    public Object doLogin() {
        return SaOAuth2ServerProcessor.instance.doLogin();
    }

    // 用户确认授权
    @RequestMapping("/oauth2/doConfirm")
    public Object doConfirm() {
        return SaOAuth2ServerProcessor.instance.doConfirm();
    }

    // Code 换 Access-Token || 模式三：密码式
    @RequestMapping("/oauth2/token")
    public Object token() {
        Object token = SaOAuth2ServerProcessor.instance.token();
        System.out.println(token.getClass());
        return token;
    }

    // Refresh-Token 刷新 Access-Token
    @RequestMapping("/oauth2/refresh")
    public Object refresh() {
        return SaOAuth2ServerProcessor.instance.refresh();
    }

    // 回收 Access-Token
    @RequestMapping("/oauth2/revoke")
    public Object revoke() {
        return SaOAuth2ServerProcessor.instance.revoke();
    }

    // 模式四：凭证式
    @RequestMapping("/oauth2/client_token")
    public Object clientToken() {
        return SaOAuth2ServerProcessor.instance.clientToken();
    }

    // ---------- 开放相关资源接口： Client端根据 Access-Token ，置换相关资源 ------------

    // 获取 userinfo 信息：昵称、头像、性别等等
    @RequestMapping("/oauth2/userinfo")
    public Map<String, Object> userinfo() {
        // 获取 Access-Token 对应的账号id
        String accessToken = SaOAuth2Manager.getDataResolver().readAccessToken(SaHolder.getRequest());
        Object loginId = SaOAuth2Util.getLoginIdByAccessToken(accessToken);
        System.out.println("-------- 此Access-Token对应的账号id: " + loginId);

        // 校验 Access-Token 是否具有权限: userinfo
        SaOAuth2Util.checkAccessTokenScope(accessToken, "userinfo");

        // 模拟账号信息 （真实环境需要查询数据库获取信息）
        Map<String, Object> map = new LinkedHashMap<>();
         map.put("id", loginId);
         map.put("mail","sa@qq.com");
         map.put("name","sa");
        map.put("nickname", "林小林");
        map.put("avatar", "http://xxx.com/1.jpg");
        map.put("age", "18");
        map.put("sex", "男");
        map.put("address", "山东省 青岛市 城阳区");
        return map;
    }
}
